{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这个实例中，我们使用tensorflow来实现一个简单的手写数字识别的网络，并用这个网络来做个\n",
    "简单的识别示例。\n",
    "\n",
    "首先导入一些用到的库。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:50.515650Z",
     "start_time": "2018-06-01T06:32:43.133728Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.ERROR)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.15.0-rc2\n"
     ]
    }
   ],
   "source": [
    "print(tf.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:39:48.304594Z",
     "start_time": "2018-06-01T04:55:17.674707Z"
    }
   },
   "source": [
    "先来看看数据长什么样子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.075054Z",
     "start_time": "2018-06-01T06:32:50.518290Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000, 10)\n",
      "(5000, 784)\n",
      "(5000, 10)\n",
      "(10000, 784)\n",
      "(10000, 10)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\", one_hot=True)\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:49:40.128071Z",
     "start_time": "2018-06-01T05:49:40.123888Z"
    }
   },
   "source": [
    "可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量，\n",
    "所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.695746Z",
     "start_time": "2018-06-01T06:32:51.077167Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4, 4, idx + 1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(np.argmax(mnist.train.labels[idx])))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28, 28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来，定义用于训练的网络，首先定义网络的输入。\n",
    "\n",
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个bool类型的变量用于标识当前网络是否正在训练。\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.706044Z",
     "start_time": "2018-06-01T06:32:51.698913Z"
    }
   },
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784], name='x')\n",
    "y = tf.placeholder(\"float\", [None, 10], name='y')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因为我们输入的是图片展开后的一维向量，所以第一步就需要先把一维向量还原为二维的图片。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.719298Z",
     "start_time": "2018-06-01T06:32:51.707730Z"
    }
   },
   "outputs": [],
   "source": [
    "x_image = tf.reshape(x, [-1, 28, 28, 1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:07:36.530623Z",
     "start_time": "2018-06-01T06:07:36.522665Z"
    }
   },
   "source": [
    "接下来，我们定义第一个卷积层，使用6个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式选择valid，所以输出数据的宽高变为24x24,但是深度已经从原来的1变成了6。\n",
    "本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.764292Z",
     "start_time": "2018-06-01T06:32:51.721295Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv1'):\n",
    "    C1 = tf.contrib.slim.conv2d(\n",
    "        x_image, 6, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来进行stride为2的最大池化，池化后，输出深度不变，但是长宽减半，所以输出变成了12x12,深度6."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.774112Z",
     "start_time": "2018-06-01T06:32:51.766784Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool1'):\n",
    "    S2 = tf.contrib.slim.max_pool2d(C1, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:10:16.678485Z",
     "start_time": "2018-06-01T06:10:16.671472Z"
    }
   },
   "source": [
    "接下来，我们定义第二个卷积层，使用16个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式还是选择valid，输出8x8,深度为16，本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.805912Z",
     "start_time": "2018-06-01T06:32:51.776959Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv2'):\n",
    "    C3 = tf.contrib.slim.conv2d(\n",
    "        S2, 16, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再进行一次stride为2的最大池化，输出为4x4,深度16。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.814748Z",
     "start_time": "2018-06-01T06:32:51.807560Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool2'):\n",
    "    S4 = tf.contrib.slim.max_pool2d(C3, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "池化后的数据是3维的，这里做一个拉平的操作，将3维数据展开到1维，然后送入两层全连接，全连接隐层中神经元个数分别为120，84。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.856740Z",
     "start_time": "2018-06-01T06:32:51.817287Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('fc1'):\n",
    "    S4_flat = tf.contrib.slim.flatten(S4)\n",
    "    C5 = tf.contrib.slim.fully_connected(\n",
    "        S4_flat, 120, activation_fn=tf.nn.relu)\n",
    "\n",
    "with tf.name_scope('fc2'):\n",
    "    F6 = tf.contrib.slim.fully_connected(C5, 84, activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:17:39.880958Z",
     "start_time": "2018-06-01T06:17:39.869797Z"
    }
   },
   "source": [
    "###### 对特征添加一个0.6的dropout，以40%的概率丢弃特征中的某些数据，\n",
    "这样可以提高网络的推广能力，减少过拟合的可能性。\n",
    "\n",
    "需要注意的是，dropout仅在训练的时候使用，验证的时候，需要关闭dropout，\n",
    "所以验证时候的keep_prob是1.0。\n",
    "\n",
    "dropout的输出最终送入一个隐层为10的全连接层，这个全连接层即为最后的分类器。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.913419Z",
     "start_time": "2018-06-01T06:32:51.860766Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('dropout'):\n",
    "    keep_prob = tf.placeholder(name='keep_prob', dtype=tf.float32)\n",
    "    F6_drop = tf.nn.dropout(F6, keep_prob)\n",
    "\n",
    "with tf.name_scope('fc3'):\n",
    "    logits = tf.contrib.slim.fully_connected(F6_drop, 10, activation_fn=None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits,\n",
    "这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为0.3。\n",
    "\n",
    ">试试看，增大减小学习率，换个优化器再进行训练会发生什么。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.084738Z",
     "start_time": "2018-06-01T06:32:51.915376Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Conv/weights:0\n",
      "Conv/biases:0\n",
      "Conv_1/weights:0\n",
      "Conv_1/biases:0\n",
      "fully_connected/weights:0\n",
      "fully_connected/biases:0\n",
      "fully_connected_1/weights:0\n",
      "fully_connected_1/biases:0\n",
      "fully_connected_2/weights:0\n",
      "fully_connected_2/biases:0\n"
     ]
    }
   ],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "l2_loss = tf.add_n([\n",
    "    tf.nn.l2_loss(w)\n",
    "    for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)\n",
    "])\n",
    "\n",
    "for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES):\n",
    "    print(w.name)\n",
    "    tf.summary.histogram(w.name, w)\n",
    "    \n",
    "total_loss = cross_entropy_loss + 7e-5 * l2_loss\n",
    "tf.summary.scalar('cross_entropy_loss', cross_entropy_loss)\n",
    "tf.summary.scalar('l2_loss', l2_loss)\n",
    "tf.summary.scalar('total_loss', total_loss)\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=0.3).minimize(total_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:25:56.449132Z",
     "start_time": "2018-06-01T06:25:56.438340Z"
    }
   },
   "source": [
    "需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布，\n",
    "要想看到概率分布，还需要做一下softmax。\n",
    "\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:39:50.010829Z",
     "start_time": "2018-06-01T06:39:49.997501Z"
    }
   },
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1))\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.127795Z",
     "start_time": "2018-06-01T06:32:52.103115Z"
    }
   },
   "outputs": [],
   "source": [
    "batch_size = 100\n",
    "trainig_step = 1100\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:35:22.270272Z",
     "start_time": "2018-06-01T06:33:18.829198Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.281224, the validation accuracy is 0.9046\n",
      "after 200 training steps, the loss is 0.148463, the validation accuracy is 0.9568\n",
      "after 300 training steps, the loss is 0.273082, the validation accuracy is 0.9608\n",
      "after 400 training steps, the loss is 0.0994335, the validation accuracy is 0.9728\n",
      "after 500 training steps, the loss is 0.070872, the validation accuracy is 0.9764\n",
      "after 600 training steps, the loss is 0.0568977, the validation accuracy is 0.9776\n",
      "after 700 training steps, the loss is 0.0960124, the validation accuracy is 0.9748\n",
      "after 800 training steps, the loss is 0.127191, the validation accuracy is 0.9778\n",
      "after 900 training steps, the loss is 0.127609, the validation accuracy is 0.972\n",
      "after 1000 training steps, the loss is 0.00909944, the validation accuracy is 0.9798\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9801\n"
     ]
    }
   ],
   "source": [
    "merged = tf.summary.merge_all()\n",
    "with tf.Session() as sess:\n",
    "\n",
    "    writer = tf.summary.FileWriter(\"logs/\", sess.graph)\n",
    "\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "        keep_prob: 1.0\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss, rs = sess.run(\n",
    "            [optimizer, cross_entropy_loss, merged],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                keep_prob: 0.6\n",
    "            })\n",
    "        writer.add_summary(rs, i)\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:58:16.766415Z",
     "start_time": "2018-06-01T06:58:15.918700Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16],\n",
    "                keep_prob: 1.0\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(\n",
    "                np.argmax(mnist.test.labels[idx]), order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. log tensorboard 截图\n",
    "\n",
    "![scalars_cross_entropy_loss](https://gitee.com/zchsoft/learning-ai/raw/master/w10/cross_entropy_loss.png)\n",
    "![scalars_l2_loss](https://gitee.com/zchsoft/learning-ai/raw/master/w10/l2_loss.png)\n",
    "![scalars_total_l2_loss](https://gitee.com/zchsoft/learning-ai/raw/master/w10/total_loss.png)\n",
    "\n",
    "![graph](https://gitee.com/zchsoft/learning-ai/raw/master/w10/graph.png)\n",
    "\n",
    "![histograms_conv1](https://gitee.com/zchsoft/learning-ai/raw/master/w10/histograms_conv1.png)\n",
    "![histograms_conv](https://gitee.com/zchsoft/learning-ai/raw/master/w10/histograms_conv.png)\n",
    "![histograms_fully_connected_1](https://gitee.com/zchsoft/learning-ai/raw/master/w10/histograms_fully_connected_1.png)\n",
    "![histograms_fully_connected_2](https://gitee.com/zchsoft/learning-ai/raw/master/w10/histograms_fully_connected_2.png)\n",
    "![histograms_fully_connected](https://gitee.com/zchsoft/learning-ai/raw/master/w10/histograms_fully_connected.png)\n",
    "\n",
    "![distributions_conv_1](https://gitee.com/zchsoft/learning-ai/raw/master/w10/distributions_conv_1.png)\n",
    "![distributions_conv](https://gitee.com/zchsoft/learning-ai/raw/master/w10/distributions_conv.png)\n",
    "![distributions_fully_connected_1](https://gitee.com/zchsoft/learning-ai/raw/master/w10/distributions_fully_connected_1.png)\n",
    "![distributions_fully_connected_2](https://gitee.com/zchsoft/learning-ai/raw/master/w10/distributions_fully_connected_2.png)\n",
    "![distributions_fully_connected](https://gitee.com/zchsoft/learning-ai/raw/master/w10/distributions_fully_connected.png)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2. 卷积的特性：\n",
    "  1. 局部相关性：相邻的像素结合起来表达一个特征，距离较远的像素影响较小；随着层数的增加，feature map里面的点映射到原图的感受野越来越大；带来一定的遮挡不变性；不仅仅可以适用于图像，其他具有局部相关性的数据均可以尝试卷积网络处理\n",
    "  2. 参数共享：卷积核作用于整幅图像\n",
    "  3. 平移宽容：在任何位置都可以激活神经元\n",
    "  4. 缩放宽容：一定程度内的图像缩放（通常认为25%以内）不会产生太大干扰"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3. 为什么卷积的效果要比全连接网络好\n",
    "\n",
    "  可以根据卷积的特性来解释：\n",
    "  1. 平移宽容性和缩放宽容性可以让位置和大小不是很标准的手写字符识别的更准；\n",
    "  2. 局部相关性考虑相邻像素特征，对特征的提取更准确；"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
